package com.qingyun.edusysteam.utils;

import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

public class ImageUploadUtil {

    // 允许的图片格式
    private static final String[] ALLOWED_SUFFIX = {".jpg", ".jpeg", ".png", ".gif"};

    /**
     * 上传图片并返回保存的文件名
     * @param file 前端传来的文件
     * @param basePath 保存的基础路径（如 D:/upload/images/）
     * @return 保存后的文件名（含后缀）
     * @throws IOException 保存失败时抛出
     * @throws IllegalArgumentException 文件验证失败时抛出
     */
    public static String upload(MultipartFile file, String basePath) throws IOException {
        // 1. 验证文件是否为空
        if (file.isEmpty()) {
            throw new IllegalArgumentException("文件不能为空");
        }

        // 2. 验证文件大小（示例：不超过 10MB）
        if (file.getSize() > 10 * 1024 * 1024) {
            throw new IllegalArgumentException("文件大小不能超过 10MB");
        }

        // 3. 验证文件格式
        String originalFilename = file.getOriginalFilename();
        String fileSuffix = getFileSuffix(originalFilename);
        if (!isAllowedSuffix(fileSuffix)) {
            throw new IllegalArgumentException("不支持的文件格式，仅允许：jpg、jpeg、png、gif");
        }

        // 4. 生成唯一文件名
        String fileName = UUID.randomUUID().toString() + fileSuffix;

        // 5. 确保保存目录存在
        File saveDir = new File(basePath);
        if (!saveDir.exists()) {
            saveDir.mkdirs();
        }

        // 6. 保存文件
        File saveFile = new File(basePath + fileName);
        file.transferTo(saveFile);

        return fileName;
    }

    // 获取文件后缀（如 .jpg）
    private static String getFileSuffix(String filename) {
        if (filename == null || !filename.contains(".")) {
            return "";
        }
        return filename.substring(filename.lastIndexOf(".")).toLowerCase();
    }

    // 验证文件后缀是否允许
    private static boolean isAllowedSuffix(String suffix) {
        for (String allowed : ALLOWED_SUFFIX) {
            if (allowed.equalsIgnoreCase(suffix)) {
                return true;
            }
        }
        return false;
    }
}
